package com.alameda.common.utils;

import com.alameda.common.exception.BusinessException;
import com.alameda.common.result.ResultEnum;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

import java.util.Collection;
import java.util.Map;

/**
 * 断言工具类
 *
 * @author Lv
 * @date 2024/2/19
 */
public class AssertUtils extends Assert {
    /**
     * 断言对象为空
     *
     * @param object     断言为空的对象
     * @param resultEnum 通用返回值枚举
     */
    public static void isNull(@Nullable Object object, ResultEnum resultEnum) {
        if (PubUtils.isNotNull(object)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言对象不为空
     *
     * @param object     断言不为空的对象
     * @param resultEnum 通用返回值枚举
     */
    public static void notNull(@Nullable Object object, ResultEnum resultEnum) {
        if (PubUtils.isNull(object)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言对象不为空
     *
     * @param object       断言不为空的对象
     * @param resultEnum   通用返回值枚举
     * @param errorMessage 详细错误信息
     */
    public static void notNull(@Nullable Object object, ResultEnum resultEnum, String errorMessage) {
        if (PubUtils.isNull(object)) {
            BusinessException.throwException(resultEnum, errorMessage);
        }
    }

    /**
     * 断言单列集合为空
     *
     * @param collections 断言为空的单列集合
     * @param resultEnum  通用返回值枚举
     */
    public static void isEmpty(@Nullable Collection<?> collections, ResultEnum resultEnum) {
        if (PubUtils.isNotEmpty(collections)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言字符串为空
     *
     * @param string     断言为空的字符串
     * @param resultEnum 通用返回值枚举
     */
    public static void isEmpty(@Nullable String string, ResultEnum resultEnum) {
        if (PubUtils.isNotEmpty(string)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言字符串为空
     *
     * @param string       断言为空的字符串
     * @param resultEnum   通用返回值枚举
     * @param errorMessage 详细错误信息
     */
    public static void isEmpty(@Nullable String string, ResultEnum resultEnum, String errorMessage) {
        if (PubUtils.isNotEmpty(string)) {
            BusinessException.throwException(resultEnum, errorMessage);
        }
    }

    /**
     * 断言数组为空
     *
     * @param objects    断言为空的数组
     * @param resultEnum 通用返回值枚举
     */
    public static void isEmpty(@Nullable Object[] objects, ResultEnum resultEnum) {
        if (PubUtils.isNotEmpty(objects)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言双列集合为空
     *
     * @param map        断言为空的双列集合
     * @param resultEnum 通用返回值枚举
     */
    public static void isEmpty(@Nullable Map<?, ?> map, ResultEnum resultEnum) {
        if (PubUtils.isNotEmpty(map)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言单列集合不为空
     *
     * @param collections 断言不为空的单列集合
     * @param resultEnum  通用返回值枚举
     */
    public static void notEmpty(@Nullable Collection<?> collections, ResultEnum resultEnum) {
        if (PubUtils.isEmpty(collections)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言单列集合不为空
     *
     * @param collections  断言不为空的单列集合
     * @param resultEnum   通用返回值枚举
     * @param errorMessage 详细错误信息
     */
    public static void notEmpty(@Nullable Collection<?> collections, ResultEnum resultEnum, String errorMessage) {
        if (PubUtils.isEmpty(collections)) {
            BusinessException.throwException(resultEnum, errorMessage);
        }
    }

    /**
     * 断言双列集合不为空
     *
     * @param map        断言不为空的双列集合
     * @param resultEnum 通用返回值枚举
     */
    public static void notEmpty(@Nullable Map<?, ?> map, ResultEnum resultEnum) {
        if (PubUtils.isEmpty(map)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言数组不为空
     *
     * @param objects    断言不为空的数组
     * @param resultEnum 通用返回值枚举
     */
    public static void notEmpty(@Nullable Object[] objects, ResultEnum resultEnum) {
        if (PubUtils.isEmpty(objects)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言字符串不为空
     *
     * @param string     断言不为空的字符串
     * @param resultEnum 通用返回值枚举
     */
    public static void notEmpty(@Nullable String string, ResultEnum resultEnum) {
        if (PubUtils.isEmpty(string)) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言字符串不为空
     *
     * @param string       断言不为空的字符串
     * @param resultEnum   通用返回值枚举
     * @param errorMessage 详细错误信息
     */
    public static void notEmpty(@Nullable String string, ResultEnum resultEnum, String errorMessage) {
        if (PubUtils.isEmpty(string)) {
            BusinessException.throwException(resultEnum, errorMessage);
        }
    }

    /**
     * 断言布尔值为true
     *
     * @param expression 断言为true的布尔值
     * @param resultEnum 通用返回值枚举
     */
    public static void isTrue(@Nullable boolean expression, ResultEnum resultEnum) {
        if (!expression) {
            BusinessException.throwException(resultEnum);
        }
    }

    /**
     * 断言布尔值为false
     *
     * @param expression 断言为false的布尔值
     * @param resultEnum 通用返回值枚举
     */
    public static void isFalse(@Nullable boolean expression, ResultEnum resultEnum) {
        if (expression) {
            BusinessException.throwException(resultEnum);
        }
    }
}
